package com.xxwu.messagequeue.common;

import java.io.*;

// 以下方法适用于所有 object对象
// 要想让这个对象能够被序列化和反序列化，必须要让这个类实现 Serializable 接口，否则运行将会抛异常
public class BinaryTool {

    // 将 Object 进行序列化
    public static byte[] tobytes(Object object) throws IOException {
        // 这个流对象就相当于一个变长的字节数组
        // 通过 writeObject 逐渐将 object 写入 byteArrayOutputStream 中，最后转化为字节数组形式进行返回
        try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()){
            try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                // 这里的 writeObject 将 object 序列化，写入 objectOutputStream 中
                // objectOutputStream 又和 byteArrayOutputStream 关联，最后将 object 写入到 byteArrayOutputStream
                objectOutputStream.writeObject(object);
            }
            // 将 byteArrayOutputStream 中存储的二进制数据以字节数组形式返回
            return byteArrayOutputStream.toByteArray();
        }
    }

    // 将字节数组进行反序列化
    // 使用 ObjectInputStream 的好处就是能够处理变长的字节数组
    public static Object frombytes(byte[] bytes) throws IOException, ClassNotFoundException {
        try(ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes)){
            try(ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
                // readObject 就是从 bytes 数组中获取数据进行反序列化
                return objectInputStream.readObject();
            }
        }
    }
}
